home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / docs / asm_guide / assembler course / demo.s < prev    next >
Text File  |  1992-04-27  |  24KB  |  1,107 lines

  1.  
  2. ; ok, here it is... a real demo, go ahead and mess around, but maybe
  3. ; first make a backup for safety...
  4.  
  5. ; this demo consists of 4 parts:
  6. ; -    a picture on top of the screen, nothing happens with it
  7. ; -    a scroll (blitter was used to copy new chars on the screen
  8. ;          and to scroll the whole thing)
  9. ; -    a starfield (using 1 sprite with more controlling words)
  10. ; -    replay routine (not own-made, can be found on each noise-
  11. ;    tracker disk)
  12. ; -    equalisers, needs some knowledge of the replayroutine, like
  13. ;    when a new note is played. (see near the bottom of source)
  14.  
  15. ; the lines marked with * can be changed when you for example take
  16. ; another picture or font etc...
  17. ; you are however not completely free to change the values in
  18. ; whatever you want (don't take a picture height of 7000 lines for
  19. ; example coz the demo won't work as it should)
  20.  
  21. ; HOW TO PUT EVERYTHING TOGETHER
  22. ;--------------------------------
  23. ;
  24. ; first change everything as you like it, and test it.
  25. ; assemble it, (a) and save the object (wo) (that's ALL!!!)
  26. ; if you want to use another picture, draw it with dpaint, save it
  27. ; use IFFconvert to save it as RAW colors BEFORE. It must be 320 wide
  28. ; note down the height coz you must fill it in into the source (see ***)
  29.  
  30.     section MYFIRSTDEMO,code_c        ; force loading into CHIPMEM
  31.  
  32. main:    movem.l    a0-a6/d0-d7,-(a7)
  33.  
  34.     move.l    $4,a6
  35.     lea    gfxname,a1
  36.     jsr    -408(a6)        ; open gfx library
  37.     move.l    d0,gfxbase
  38.  
  39.     jsr    -132(a6)        ; forbid interrupts
  40.  
  41.     bsr    fillcopper        ;precalculation of some data
  42.     bsr    calcfontdata        ;
  43.     jsr    mt_init            ;init. of replayroutine
  44.  
  45.     move.w    $dff01c,d0        ;save    INTENA
  46.     move.w    $dff01e,d1        ;    INTREQ
  47.     move.w    $dff002,d2        ;    DMACON
  48.  
  49.     move.w    #$7fff,$dff096            ; clear DMACON
  50.     move.w    #%1000001111100000,$dff096    ; set needed DMA's
  51.  
  52.     move.l    #copperlist,$dff080    ;install new copper
  53.     clr.l    $dff088            ;and start
  54.  
  55.     movem.l a0-a6/d0-d7,-(a7)
  56.  
  57. loop:    bsr    waitvblank        ; wait for 'timing'
  58.     bsr    scroll            ; do scroll routine
  59.     bsr    eq_down            ; lower equalisers
  60.     bsr    movestars        ; do starroutine
  61.     jsr    mt_music        ; do replayroutine
  62.     btst    #6,$bfe001        ; check left ear
  63.     bne.s    loop
  64.  
  65.     movem.l    (a7)+,a0-a6/d0-d7
  66.  
  67.     or.w    #$8000,d0        ; set the 'set/clr' bit
  68.     or.w    #$8000,d1
  69.     or.w    #$8000,d2
  70.     move.w    d2,$dff096        ;restore values in regs
  71.     move.w    d1,$dff09c        ;
  72.     move.w    d0,$dff09a        ;
  73.  
  74.     jsr    mt_end            ; end of replayroutine
  75.  
  76.     move.l    gfxbase,a1
  77.     move.l    $26(a1),$dff080        ;restore copperlist
  78.  
  79.     move.l    $4,a6
  80.     jsr    -414(a6)        ;close lib
  81.     jsr    -138(a6)        ;permit interrupts
  82.  
  83.     move.w    #$8100,$dff096        ;turn on bitplane dma
  84.                     ;(just to be sure)
  85.  
  86.     movem.l    (a7)+,a0-a6/d0-d7
  87.     rts                ;exit
  88.  
  89. *****************************************************************
  90. *                                *
  91. *    All kinds of routines...                *
  92. *                                *
  93. *****************************************************************
  94.  
  95. waitvblank:
  96.     cmp.b    #$ff,$dff006
  97.     bne.s    waitvblank
  98. waitabitmore:
  99.     cmp.b    #$20,$dff006
  100.     bne.s    waitabitmore
  101.     rts
  102. ;--------------------------------------------------------------
  103. waitblitter:
  104.     btst    #14,$2(a5)
  105.     bne.s    waitblitter
  106.     rts
  107. ;--------------------------------------------------------------
  108. movestars:
  109.     lea.l    star_speedtab,a0
  110.     lea.l    stars,a1
  111.     move.l    #c_numofstars-1,d0
  112. mslp:    move.b    (a0)+,d1    ; a0 contains speed for each star
  113.     add.b    d1,1(a1)    ; 1(a1) = bits H8-H1 of contr.words
  114.     addq.l    #8,a1        ; next set of controlling words
  115.     dbf    d0,mslp
  116.     rts
  117. ;--------------------------------------------------------------
  118. eq_down:cmp.w    #$400,eq0+2
  119.     beq.s    eq_d1
  120.     sub.w    #$100,eq0+2
  121. eq_d1:    cmp.w    #$400,eq1+2
  122.     beq.s    eq_d2
  123.     sub.w    #$100,eq1+2
  124. eq_d2:    cmp.w    #$400,eq2+2
  125.     beq.s    eq_d3
  126.     sub.w    #$100,eq2+2
  127. eq_d3:    cmp.w    #$400,eq3+2
  128.     beq.s    eq_d4
  129.     sub.w    #$100,eq3+2
  130. eq_d4:    rts
  131.  
  132. *****************************************************************
  133. *                                *
  134. *    scroll                            *
  135. *                                *
  136. *****************************************************************
  137. scroll:
  138.     tst.b    delay        ; if delay is not 0, delay=delay-1
  139.     beq.s    doscroll    ; only if delay=0, a scroll is done
  140.     subq.b    #1,delay
  141.     bra    endscroll
  142. doscroll:
  143.     move.l    #$dff000,a5    ; start of hardware regs in a5
  144.  
  145.  
  146.     lea.l    s_pic,a0        ; this routine scrolls the
  147.     lea.l    s_pic-2,a1        ; whole scrollpic by 4 bits
  148.     move.l    #s_depth-1,d1        ; using the barrelshifter
  149. scrollraster:
  150.     bsr    waitblitter
  151.     move.l    a0,$50(a5)            ; source address
  152.     move.l    a1,$54(a5)            ; destin.address
  153.     move.w    #$ffff,$44(a5)            ; Firstwordmask
  154.     move.w    #$ffff,$46(a5)            ; Lastwordmask
  155.     clr.w    $42(a5)                ; bltcon1
  156.     clr.w    $64(a5)                ; modulo source = 0
  157.     clr.w    $66(a5)                ; modulo destin = 0
  158.     move.w    #%1100100111110000,$40(a5)    ; bltcon0
  159.     move.w    #s_blitsize,$58(a5)        ; trigger/size
  160.  
  161.     add.l    #s_planesize,a0            ; next plane src
  162.     add.l    #s_planesize,a1            ; next plane dst
  163.  
  164.     dbf    d1,scrollraster            ; loop until d1= -1
  165.  
  166.  
  167.  
  168.     subq.b    #4,charpos    ; now, char has scrolled 4 pixels
  169.     tst.b    charpos        ; time for new char ?
  170.     bgt    endscroll    ; no !
  171.  
  172.     move.l    #f_endchartab,d1    ; we'll need this value often
  173.                     ; so let's put it in d1 (faster)
  174. find_new_char:
  175.     move.l    textptr,a2        ; pointer to text
  176.     move.b    (a2)+,d2        ; take char (+increase)
  177.     tst.b    (a2)            ; next char = 0 ? 
  178.     bne.s    newchgo
  179.     move.l    #textrestart,a2        ; then scroll restarts
  180. newchgo:move.l    a2,textptr        ; save new pos.textptr
  181.  
  182.     lea.l    f_chartab,a3        ;this routine searches the 
  183.     moveq.l    #-1,d0            ;chartab for the startaddres
  184. newchlp:addq.l    #1,d0            ;of the char that we must
  185.     move.b    (a3)+,d3        ;put on screen. This is a 
  186.     cmp.l    d1,a3            ;silly routine that is not
  187.     bgt.s    specialhandler        ;very fast. I'll rewrite it
  188.     cmp.b    d2,d3            ;when I'm in a good mood.
  189.     bne.s    newchlp            ;
  190.     move.b    #f_widthB*8,charpos    ;
  191.     asl.w    #2,d0            ;
  192.     add.l    #f_startaddr,d0        ;
  193.     move.l    d0,a0            ;
  194.     move.l    (a0),a0            ;
  195. endnewch:
  196.  
  197.     ; the next bit will copy 1 char from the charpic onto the
  198.     ; scrollpic.  a0 is the address of the char (source) which
  199.     ; we managed to find using the previous routine.
  200.     ; a1 (destination) is the right side of the scrollpic.
  201.  
  202.     move.l    #s_depth-1,d1
  203.     move.l    #s_pic+s_widthB-f_widthB,a1    ;dest addr.
  204. putch:    bsr    waitblitter
  205.     move.l    a0,$50(a5)            ; source a
  206.     move.l    a1,$54(a5)            ; destin.
  207.     move.w    #$ffff,$44(a5)            ; fwm
  208.     move.w    #$ffff,$46(a5)            ; lwm
  209.     clr.w    $42(a5)                ; con1
  210.     move.w    #f_blitmoda,$64(a5)        ; mod a
  211.     move.w    #f_blitmodd,$66(a5)        ; mod d
  212.     move.w    #%0000100111110000,$40(a5)    ; con0
  213.     move.w    #f_blitsize,$58(a5)        ; trigger/size
  214.  
  215.     add.l    #f_planesize,a0            ;next pl.a
  216.     add.l    #s_planesize,a1            ;next pl.d
  217.     dbf    d1,putch
  218. endscroll:
  219.     rts
  220.  
  221. specialhandler:
  222.     cmp.b    #"P",d2
  223.     bne.s    eff2
  224.     move.b    #50,delay
  225. eff2:                    ; here you can add your
  226.                     ; own effects...
  227.     bra    find_new_char
  228.  
  229. *****************************************************************
  230. *                                *
  231. *    calculation of addresses and values for copperlist    *
  232. *                                *
  233. *****************************************************************
  234.  
  235. fillcopper:
  236.     movem.l    a0-a6/d0-d7,-(a7)
  237.  
  238. ;installpicplanes:
  239.     lea.l    p_planept,a0
  240.     move.l    #p_pic,d0
  241.     move.w    #$e0,d1
  242.     move.l    #p_depth-1,d2
  243. ipp:    move.w    d1,(a0)+
  244.     addq.w    #2,d1
  245.     swap    d0
  246.     move.w    d0,(a0)+        ; this routine fills the
  247.     move.w    d1,(a0)+        ; label p_planept with
  248.     addq.w    #2,d1            ; values like $00e0hhhh
  249.     swap    d0            ; $00e2llll etc... (bplpt)
  250.     move.w    d0,(a0)+
  251.     add.l    #p_planesize,d0
  252.     dbf    d2,ipp
  253.  
  254. ;instalpiccolors:
  255.     lea.l    p_col,a0
  256.     lea.l    p_colpt,a1
  257.     move.w    #$180,d1
  258.     move.l    #p_numofcol-1,d2    ; fills copper with 
  259. ipc:    move.w    d1,(a1)+        ; $01800xxx,$01820xxx etc
  260.     addq.w    #2,d1            ; colors from picture
  261.     move.w    (a0)+,(a1)+
  262.     dbf    d2,ipc
  263.  
  264. ;installscrollplanes:
  265.     lea.l    s_planept,a0
  266.     move.l    #s_pic,d0
  267.     move.w    #$e0,d1            ; fills the BPLxPTH & L
  268.     move.l    #s_depth-1,d2        ; for the scroll-pic
  269. ifp:    move.w    d1,(a0)+
  270.     addq.w    #2,d1
  271.     swap    d0
  272.     move.w    d0,(a0)+
  273.     move.w    d1,(a0)+
  274.     addq.w    #2,d1
  275.     swap    d0
  276.     move.w    d0,(a0)+
  277.     add.l    #s_planesize,d0
  278.     dbf    d2,ifp
  279.  
  280. ;install colored lines
  281.     lea.l    c_line1,a0
  282.     lea.l    c_line2,a1
  283.     lea.l    c_coltab,a2        ; fills c_line1 and c_line2
  284.     move.l    #c_numofdivs-1,d0    ; with $01800xxx to create
  285.     move.l    #$01800000,d1        ; the effect of a multi-
  286. icl:    move.l    d1,d2            ; colored line.
  287.     move.w    (a2)+,d2
  288.     move.l    d2,(a0)+
  289.     move.l    d2,(a0)+
  290.     move.l    d2,(a1)+
  291.     move.l    d2,(a1)+
  292.     dbf    d0,icl
  293.  
  294. ;install SPRxPTH & SPRxPTH for sprite 1 (starfield)
  295.     move.l    #stars,d0
  296.     move.l    #$120,d1    ; spr0ptH
  297.     lea.l    spr1pt,a0
  298.  
  299.     move.w    d1,(a0)
  300.     addq.w    #2,d1        ; spr0ptL
  301.     move.w    d1,4(a0)
  302.     addq.w    #2,d1
  303.  
  304.     move.w    d0,6(a0)    ; lowword
  305.     swap    d0
  306.     move.w    d0,2(a0)    ; highword
  307.     addq.l    #8,a0
  308.  
  309. ;install SPRxPTH & L for 7 other sprites (not used)
  310.     moveq.l    #6,d2
  311. isp:    move.l    #zerosprite,d0
  312.     move.w    d0,6(a0)    ; lowword
  313.     swap    d0
  314.     move.w    d0,2(a0)    ; highword
  315.  
  316.     move.w    d1,(a0)        ; sprXptH
  317.     addq.w    #2,d1
  318.     move.w    d1,4(a0)    ; sprXptL
  319.     addq.w    #2,d1
  320.  
  321.     addq.l    #8,a0        ; next set of SPRxPT
  322.     dbf    d2,isp
  323.  
  324. ;install sprite data (vpos & hpos) for each subsprite...
  325.     lea.l    stars,a0
  326.     lea.l    star_hpostab,a1
  327.     clr.l    d0            ; 1st line sprite = 0
  328.                     ; (right after start lowerzone)
  329.     move.l    #c_numofstars-1,d1
  330. isd:    move.b    d0,(a0)+        ; V7-V0
  331.     move.b    (a1)+,(a0)+        ; H8-H1
  332.     addq.w    #1,d0
  333.     move.b    d0,(a0)+        ; L7-L0
  334.     move.b    #6,(a0)+        ; L8=1, V8=1
  335.     addq.w    #1,d0
  336.     addq.l    #4,a0
  337.     dbf    d1,isd
  338.  
  339. ;install color for each subsprite according to speed (slow=dark)
  340.     lea.l    c_starblock,a0
  341.     lea.l    star_speedtab,a1
  342.     lea.l    colortab,a2
  343.     clr.l    d0
  344.     move.l    #c_numofstars-1,d1
  345. ics:    move.b    d0,(a0)+        ; these 4 lines create in 
  346.     addq.b    #2,d0            ; the copperlist a wait-
  347.     move.b    #$0f,(a0)+        ; instr.
  348.     move.w    #$fffe,(a0)+        ; 
  349.     move.w    #$01a2,(a0)+         ; color17 (sprite1col1)
  350.     moveq.l    #0,d2
  351.     move.b    (a1)+,d2        ; check speed of current star
  352.     asl.w    #1,d2    ; speed * 2 = offset for colortab : example:
  353.             ; speed=1, offset=2 (=2nd word in tab)
  354.             ; speed=2, offset=4 (=3th word in tab)
  355.     move.w    (a2,d2),(a0)+
  356.     dbf    d1,ics
  357.  
  358. endfc:    movem.l    (a7)+,a0-a6/d0-d7
  359.     rts
  360.  
  361. *****************************************************************
  362. *                                *
  363. *    calculation of constants                *
  364. *                                *
  365. *****************************************************************
  366.  
  367. calcfontdata:
  368.     movem.l    a0-a6/d0-d7,-(a7)
  369.  
  370. ;calc startaddr of each char in the pic
  371.  
  372.     lea.l    f_pic,a0
  373.     lea.l    f_startaddr,a1
  374.     move.l    #f_totheight,d2        ; fills the f_startaddr-tab
  375.     move.l    #f_widthW,d1        ; with the startaddresses of
  376. cca1:    move.l    #f_totwidthW,d0        ; the different chars in the
  377. cca2:    move.l    a0,(a1)+        ; picture. This way, the 1st
  378.     add.l    #f_widthB,a0        ; value in this tab will be
  379.     sub.l    d1,d0            ; the addres where the shape
  380.     cmp.l    #1,d0            ; of the 1st char starts etc
  381.     bgt.s    cca2            ;(used in the silly routine)
  382. nextrow:add.l    #[f_height-1]*f_totwidthB,a0
  383.     sub.l    #f_height,d2
  384.     bgt.s    cca1
  385.  
  386. endcfd:    movem.l    (a7)+,a0-a6/d0-d7
  387.     rts
  388.  
  389. *****************************************************************
  390. *                                *
  391. *    data                            *
  392. *                                *
  393. *****************************************************************
  394.  
  395. ******************* sprite stuff  **********************
  396.  
  397. c_numofstars=    20
  398.  
  399. stars:        blk.l    2*c_numofstars,$00010000
  400.  
  401. ; there are 2 longwords for each 'subsprite', the first longword
  402. ; contains the controlling words for the sprite, the second
  403. ; longword contains the shapedata. OUr sprites are only 1 line high.
  404.  
  405. zerosprite:    dc.l    0    ; last 2 words zero to end spriteDMA
  406.  
  407. star_hpostab:
  408.     dc.b    100,20,46,240,2,78,172,120,200,154,210,180,51,220
  409.     dc.b    10,90,150,32,99,24,57,0,0,0,0,0,0,0,0,0,0
  410. ; contains starting position (horiz) for each star. 
  411.  
  412. star_speedtab:
  413.     dc.b    1,2,1,2,3,3,1,3,2,2,1,2,3,1,2,2,1,2,3,2,1,3,2,1,2,1,3,1
  414.     dc.b    0,0,0,0,0,0,0
  415. ; contains speed for each star. By adding this value to the current
  416. ; hor.position, the star will seem to move to the right with a 
  417. ; certain speed.
  418.  
  419. colortab:
  420.     dc.w    $000,$444,$888,$aaa,$fff
  421. ; contains 5 words = colors for each speed
  422.  
  423.  
  424. ******************* font definitions **********************
  425.  
  426. f_depth=    2        ; planes        *
  427. f_height=    49        ; height 1 char        *
  428. f_totheight=    245        ; height charpic    *
  429. f_widthW=    2        ; width 1 char WORDS    *
  430. f_totwidthW=    288/16        ; width charpic WORDS    *
  431.  
  432. f_widthB=    f_widthW*2
  433. f_totwidthB=    f_totwidthW*2
  434. f_planesize=    f_totwidthB*f_totheight
  435. f_picsize=    f_planesize*f_depth
  436. f_numofcol=    2^f_depth
  437.  
  438. f_pic:    incbin "df0:mp.288x245x2"        ;    *
  439.  
  440. f_startaddr:    
  441.     blk.l    [[f_totheight/f_height]+1]*[[f_totwidthW/f_widthW]+1],0
  442.  
  443. f_chartab:
  444.     dc.b    "abcdefghijklmnopqrstuvwxyz.,!?:[]-0123456789 "
  445. f_endchartab:
  446.     dc.b    0
  447.     even
  448.  
  449. f_blitsize=    64*f_height+f_widthW
  450. f_blitmoda=    [f_totwidthB-f_widthB]
  451.  
  452. ******************** scroll definitions ***********************
  453.  
  454. s_height=    51            ;lines
  455. s_width=    384            ;bits
  456. s_topline=    $f5            ; < $ff !!            **
  457.  
  458. s_depth=    f_depth
  459. s_widthB=    s_width/8
  460. s_widthW=    s_width/16
  461. s_planesize=    s_height*s_widthB
  462. s_bottline=    s_topline+s_height-[2*f_height]
  463. s_mod=        [s_widthB-40]
  464.  
  465. s_buff:        blk.b    4    ; small bug : a bit of blitted part
  466.                 ; of the scroll will land here
  467. s_pic:        blk.b    [s_planesize*s_depth]
  468.  
  469. s_blitsize=    64*s_height+s_widthW
  470. f_blitmodd=    [s_widthB-f_widthB]
  471.  
  472. ************************* the logo *********************************
  473.  
  474. p_depth=    5            ;        *  adjust these values
  475. p_height=    190            ;lines        *  if you drew another
  476. p_width=    320            ;bits        *  logo !! (width must
  477. p_topline=    40            ;        *  be 320!)
  478.  
  479. p_widthB=    p_width/8
  480. p_widthW=    p_width/16
  481. p_planesize=    p_height*p_widthB
  482. p_numofcol=    2^p_depth
  483. p_mod=        p_widthB-40
  484.  
  485. p_col:    incbin "df0:abyss.320x190x5"        ;    *
  486. p_pic=    p_col+p_numofcol*2
  487.  
  488. *********************** various stuff ******************************
  489.  
  490. delay:        dc.b    0        ; counter to keep track on
  491.                     ; delay for scroll (effect1)
  492.  
  493. charpos:    dc.b    f_widthW*16    ; counter to keep track on
  494.                     ; when to put a new char on
  495.                     ; the screen. 
  496.  
  497. ; capital 'P' will pause the scroller for a while...
  498. ; only use chars that are listed in the chartab...
  499.  
  500. text:    dc.b    "here we go..."        ; this text will be shown only once...
  501. textrestart:                ; this part will be restarted each time
  502.     dc.b    " amigafreaks in pretoria and surroundings now have their own"
  503.     dc.b    " bulletin board system... call now for free downloading"
  504.     dc.b    " (12)73-9069 PP   the abyss PP  sysops are midnight horror and"
  505.     dc.b    " atlantic dolphin       low rates - hot stuff - for amiga "
  506.     dc.b    "and pc !!    silly demo coded by cool-g long ago !          "
  507.  
  508.     dc.b    0        ; add dc.b 0 at end of scrolltext !!
  509.     even
  510.  
  511. textptr:    dc.l    text        ; pointer to the position in
  512.                     ; the scrolltext (don't change!)
  513.  
  514. gfxbase:    dc.l    0
  515. gfxname:
  516.     dc.b    "graphics.library",0
  517.     even
  518.  
  519. c_numofdivs=    32
  520.  
  521. c_coltab:    dc.w    0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
  522.         dc.w    15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
  523.  
  524. ********************************************************************
  525.  
  526. copperlist:    
  527.         dc.l    $00960100    ; turn off bitpl.DMA
  528.  
  529. spr1pt:        blk.l    8*2,0        ; 8 sprites, each one with
  530.                     ; SPRxPTH & SPRxPTL
  531.  
  532.  
  533. p_colpt:    blk.l    p_numofcol,0        ;room for pic colors
  534. p_planept:    blk.l    p_depth*2,0        ;and BPLxPT
  535.  
  536.         dc.l    $008e2921,$009029c1    ;diw start/stop
  537.         dc.l    $00920030,$009400c8    ;ddf start/stop
  538.         dc.l    $01020088        ;bplcon1(smooth pos)
  539.  
  540.         dc.w    $0108,p_mod,$010a,p_mod    ;BPLMOD even/odd
  541.         dc.b    $01,$00,p_depth*16,$00    ;BPLCON0 (#planes)
  542.  
  543.         dc.b    p_topline,$0f,$ff,$fe    ;wait for topline
  544.         dc.l    $00968100        ;turn on bitpl.DMA
  545.  
  546.         dc.l    $600ffffe
  547. eq0:        dc.l    $01800000
  548.         dc.l    $680ffffe
  549.         dc.l    $01800000
  550.  
  551.         dc.l    $700ffffe
  552. eq1:        dc.l    $01800800
  553.         dc.l    $780ffffe
  554.         dc.l    $01800000
  555.  
  556.         dc.l    $800ffffe
  557. eq2:        dc.l    $01800800
  558.         dc.l    $880ffffe
  559.         dc.l    $01800000
  560.  
  561.         dc.l    $900ffffe
  562. eq3:        dc.l    $01800800
  563.         dc.l    $980ffffe
  564.         dc.l    $01800000
  565.  
  566.  
  567.         dc.b    p_topline+p_height,$0f,$ff,$fe
  568.                         ;wait for bottomline
  569.         dc.l    $00960100        ;turn off bitpl.dma
  570.  
  571. f_colpt:    dc.l    $01800000,$01820008    ; scroll colors ***
  572.         dc.l    $01840004,$0186044a
  573.         
  574. s_planept:    blk.l    s_depth*2,0        ; scroll BPLxPT's
  575.  
  576.         dc.l    $01020000        ;bplcon1
  577.         dc.l    $00920030,$009400d0    ;ddfstart/stop
  578.         dc.w    $0108,s_mod-2,$010a,s_mod-2 ;BPLMOD
  579.         dc.b    $01,$00,s_depth*16,$00    ;BPLCON0
  580.  
  581.         dc.b    s_topline,$0f,$ff,$fe    ;wait for topline
  582. c_line1:    blk.l    2*c_numofdivs,0        ;room for colored line
  583.  
  584.         dc.l    $01040000        ;priority of sprites
  585.  
  586.         dc.b    s_topline+4,$0f,$ff,$fe
  587.         dc.l    $00968100        ;turn on bitplanes
  588.         dc.l    $ffdffffe        ;wait for lower zone
  589.  
  590. c_starblock:    blk.l    2*c_numofstars,0    ;room for starcolors
  591.  
  592.         dc.b    s_topline+f_height+6-256,$0f,$ff,$fe
  593.         dc.l    $00960100        ;end of scrollpic
  594. c_line2:    blk.l    2*c_numofdivs,0        ;2nd colored line
  595.  
  596.  
  597.         dc.l    $fffffffe        ;end of copperlist1
  598.  
  599. ; now follows the noisetracker replay-routine, which can be found
  600. ; on each disk with noisetracker. Simply build it into your own
  601. ; routine, and READY !!
  602.  
  603. mt_data:incbin "df0:mod.so what..."        ;    ****
  604.  
  605. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  606. ;­   NoisetrackerV1.0 replayroutine   ­
  607. ;­ Mahoney & Kaktus - HALLONSOFT 1989 ­
  608. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  609.  
  610. mt_init:movem.l    a0-a6/d0-d7,-(a7)
  611.     lea    mt_data,a0
  612.     move.l    a0,a1
  613.     add.l    #$3b8,a1
  614.     moveq    #$7f,d0
  615.     moveq    #0,d1
  616. mt_loop:move.l    d1,d2
  617.     subq.w    #1,d0
  618. mt_lop2:move.b    (a1)+,d1
  619.     cmp.b    d2,d1
  620.     bgt.s    mt_loop
  621.     dbf    d0,mt_lop2
  622.     addq.b    #1,d2
  623.  
  624.     lea    mt_samplestarts(pc),a1
  625.     asl.l    #8,d2
  626.     asl.l    #2,d2
  627.     add.l    #$43c,d2
  628.     add.l    a0,d2
  629.     move.l    d2,a2
  630.     moveq    #$1e,d0
  631. mt_lop3:clr.l    (a2)
  632.     move.l    a2,(a1)+
  633.     moveq    #0,d1
  634.     move.w    42(a0),d1
  635.     asl.l    #1,d1
  636.     add.l    d1,a2
  637.     add.l    #$1e,a0
  638.     dbf    d0,mt_lop3
  639.  
  640.     or.b    #$2,$bfe001
  641.     move.b    #$6,mt_speed
  642.     clr.w    $dff0a8
  643.     clr.w    $dff0b8
  644.     clr.w    $dff0c8
  645.     clr.w    $dff0d8
  646.     clr.b    mt_songpos
  647.     clr.b    mt_counter
  648.     clr.w    mt_pattpos
  649.     movem.l    (a7)+,a0-a6/d0-d7
  650.     rts
  651.  
  652. mt_end:    clr.w    $dff0a8
  653.     clr.w    $dff0b8
  654.     clr.w    $dff0c8
  655.     clr.w    $dff0d8
  656.     move.w    #$f,$dff096
  657.     rts
  658.  
  659. mt_music:
  660.     movem.l    d0-d4/a0-a3/a5-a6,-(a7)
  661.     lea    mt_data,a0
  662.     addq.b    #$1,mt_counter
  663.     move.b    mt_counter,D0
  664.     cmp.b    mt_speed,D0
  665.     blt.s    mt_nonew
  666.     clr.b    mt_counter
  667.     bra    mt_getnew
  668.  
  669. mt_nonew:
  670.     lea    mt_voice1(pc),a6
  671.     lea    $dff0a0,a5
  672.     bsr    mt_checkcom
  673.     lea    mt_voice2(pc),a6
  674.     lea    $dff0b0,a5
  675.     bsr    mt_checkcom
  676.     lea    mt_voice3(pc),a6
  677.     lea    $dff0c0,a5
  678.     bsr    mt_checkcom
  679.     lea    mt_voice4(pc),a6
  680.     lea    $dff0d0,a5
  681.     bsr    mt_checkcom
  682.     bra    mt_endr
  683.  
  684. mt_arpeggio:
  685.     moveq    #0,d0
  686.     move.b    mt_counter,d0
  687.     divs    #$3,d0
  688.     swap    d0
  689.     tst.w    d0
  690.     beq.s    mt_arp2
  691.     cmp.w    #$2,d0
  692.     beq.s    mt_arp1
  693.  
  694.     moveq    #0,d0
  695.     move.b    $3(a6),d0
  696.     lsr.b    #4,d0
  697.     bra.s    mt_arp3
  698. mt_arp1:moveq    #0,d0
  699.     move.b    $3(a6),d0
  700.     and.b    #$f,d0
  701.     bra.s    mt_arp3
  702. mt_arp2:move.w    $10(a6),d2
  703.     bra.s    mt_arp4
  704. mt_arp3:asl.w    #1,d0
  705.     moveq    #0,d1
  706.     move.w    $10(a6),d1
  707.     lea    mt_periods(pc),a0
  708.     moveq    #$24,d7
  709. mt_arploop:
  710.     move.w    (a0,d0.w),d2
  711.     cmp.w    (a0),d1
  712.     bge.s    mt_arp4
  713.     addq.l    #2,a0
  714.     dbf    d7,mt_arploop
  715.     rts
  716. mt_arp4:move.w    d2,$6(a5)
  717.     rts
  718.  
  719. mt_getnew:
  720.     lea    mt_data,a0
  721.     move.l    a0,a3
  722.     move.l    a0,a2
  723.     add.l    #$c,a3
  724.     add.l    #$3b8,a2
  725.     add.l    #$43c,a0
  726.  
  727.     moveq    #0,d0
  728.     move.l    d0,d1
  729.     move.b    mt_songpos,d0
  730.     move.b    (a2,d0.w),d1
  731.     asl.l    #8,d1
  732.     asl.l    #2,d1
  733.     add.w    mt_pattpos,d1
  734.     clr.w    mt_dmacon
  735.  
  736.     lea    $dff0a0,a5
  737.     lea    mt_voice1(pc),a6
  738.     bsr.s    mt_playvoice
  739.     lea    $dff0b0,a5
  740.     lea    mt_voice2(pc),a6
  741.     bsr.s    mt_playvoice
  742.     lea    $dff0c0,a5
  743.     lea    mt_voice3(pc),a6
  744.     bsr.s    mt_playvoice
  745.     lea    $dff0d0,a5
  746.     lea    mt_voice4(pc),a6
  747.     bsr.s    mt_playvoice
  748.     bra    mt_setdma
  749.  
  750. mt_playvoice:
  751.     move.l    (a0,d1.l),(a6)
  752.     addq.l    #4,d1
  753.     moveq    #0,d2
  754.     move.b    $2(a6),d2
  755.     and.b    #$f0,d2
  756.     lsr.b    #4,d2
  757.     move.b    (a6),d0
  758.     and.b    #$f0,d0
  759.     or.b    d0,d2
  760.     tst.b    d2
  761.     beq.s    mt_setregs
  762.     moveq    #0,d3
  763.     lea    mt_samplestarts(pc),a1
  764.     move.l    d2,d4
  765.     subq.l    #$1,d2
  766.     asl.l    #2,d2
  767.     mulu    #$1e,d4
  768.     move.l    (a1,d2.l),$4(a6)
  769.     move.w    (a3,d4.l),$8(a6)
  770.     move.w    $2(a3,d4.l),$12(a6)
  771.     move.w    $4(a3,d4.l),d3
  772.     tst.w    d3
  773.     beq.s    mt_noloop
  774.     move.l    $4(a6),d2
  775.     asl.w    #1,d3
  776.     add.l    d3,d2
  777.     move.l    d2,$a(a6)
  778.     move.w    $4(a3,d4.l),d0
  779.     add.w    $6(a3,d4.l),d0
  780.     move.w    d0,8(a6)
  781.     move.w    $6(a3,d4.l),$e(a6)
  782.     move.w    $12(a6),$8(a5)
  783.     bra.s    mt_setregs
  784. mt_noloop:
  785.     move.l    $4(a6),d2
  786.     add.l    d3,d2
  787.     move.l    d2,$a(a6)
  788.     move.w    $6(a3,d4.l),$e(a6)
  789.     move.w    $12(a6),$8(a5)
  790. mt_setregs:
  791.     move.w    (a6),d0
  792.     and.w    #$fff,d0
  793.     beq    mt_checkcom2
  794.     move.b    $2(a6),d0
  795.     and.b    #$F,d0
  796.     cmp.b    #$3,d0
  797.     bne.s    mt_setperiod
  798.     bsr    mt_setmyport
  799.     bra    mt_checkcom2
  800. mt_setperiod:
  801.     move.w    (a6),$10(a6)
  802.     and.w    #$fff,$10(a6)
  803.     move.w    $14(a6),d0
  804.     move.w    d0,$dff096
  805.     clr.b    $1b(a6)
  806.  
  807.     move.l    $4(a6),(a5)
  808.     move.w    $8(a6),$4(a5)
  809.     move.w    $10(a6),d0
  810.     and.w    #$fff,d0
  811.     move.w    d0,$6(a5)
  812.     move.w    $14(a6),d0
  813.     or.w    d0,mt_dmacon
  814.     bra    mt_checkcom2
  815.  
  816. mt_setdma:
  817.     move.w    #$12c,d0
  818. mt_wait:dbf    d0,mt_wait
  819.     move.w    mt_dmacon,d0
  820.     or.w    #$8000,d0
  821.     move.w    d0,$dff096
  822.     move.w    #$12c,d0
  823. mt_wai2:dbf    d0,mt_wai2
  824.     lea    $dff000,a5
  825.     lea    mt_voice4(pc),a6
  826.     move.l    $a(a6),$d0(a5)
  827.     move.w    $e(a6),$d4(a5)
  828.     lea    mt_voice3(pc),a6
  829.     move.l    $a(a6),$c0(a5)
  830.     move.w    $e(a6),$c4(a5)
  831.     lea    mt_voice2(pc),a6
  832.     move.l    $a(a6),$b0(a5)
  833.     move.w    $e(a6),$b4(a5)
  834.     lea    mt_voice1(pc),a6
  835.     move.l    $a(a6),$a0(a5)
  836.     move.w    $e(a6),$a4(a5)
  837.  
  838.     add.w    #$10,mt_pattpos
  839.     cmp.w    #$400,mt_pattpos
  840.     bne.s    mt_endr
  841. mt_nex:    clr.w    mt_pattpos
  842.     clr.b    mt_break
  843.     addq.b    #1,mt_songpos
  844.     and.b    #$7f,mt_songpos
  845.     move.b    mt_songpos,d1
  846.     cmp.b    mt_data+$3b6,d1
  847.     bne.s    mt_endr
  848.     move.b    mt_data+$3b7,mt_songpos
  849. mt_endr:tst.b    mt_break
  850.     bne.s    mt_nex
  851.  
  852. ; equaliser check. if the first word of mt_voiceX is not zero, a new
  853. ; note was played.
  854.  
  855.     lea.l    mt_voice1,a6
  856.     tst.w    (a6)
  857.     beq.s    mt_chk1
  858.     lea.l    eq0,a6
  859.     move.w    #$f00,2(a6)
  860. mt_chk1:lea.l    mt_voice2,a6
  861.     tst.w    (a6)
  862.     beq.s    mt_chk2
  863.     lea.l    eq1,a6
  864.     move.w    #$f00,2(a6)
  865. mt_chk2:lea.l    mt_voice3,a6
  866.     tst.w    (a6)
  867.     beq.s    mt_chk3
  868.     lea.l    eq2,a6
  869.     move.w    #$f00,2(a6)
  870. mt_chk3:lea.l    mt_voice4,a6
  871.     tst.w    (a6)
  872.     beq.s    mt_chk4
  873.     lea.l    eq3,a6
  874.     move.w    #$f00,2(a6)
  875. mt_chk4:
  876.  
  877.     movem.l    (a7)+,d0-d4/a0-a3/a5-a6
  878.     rts
  879.  
  880. mt_setmyport:
  881.     move.w    (a6),d2
  882.     and.w    #$fff,d2
  883.     move.w    d2,$18(a6)
  884.     move.w    $10(a6),d0
  885.     clr.b    $16(a6)
  886.     cmp.w    d0,d2
  887.     beq.s    mt_clrport
  888.     bge.s    mt_rt
  889.     move.b    #$1,$16(a6)
  890.     rts
  891. mt_clrport:
  892.     clr.w    $18(a6)
  893. mt_rt:    rts
  894.  
  895. mt_myport:
  896.     move.b    $3(a6),d0
  897.     beq.s    mt_myslide
  898.     move.b    d0,$17(a6)
  899.     clr.b    $3(a6)
  900. mt_myslide:
  901.     tst.w    $18(a6)
  902.     beq.s    mt_rt
  903.     moveq    #0,d0
  904.     move.b    $17(a6),d0
  905.     tst.b    $16(a6)
  906.     bne.s    mt_mysub
  907.     add.w    d0,$10(a6)
  908.     move.w    $18(a6),d0
  909.     cmp.w    $10(a6),d0
  910.     bgt.s    mt_myok
  911.     move.w    $18(a6),$10(a6)
  912.     clr.w    $18(a6)
  913. mt_myok:move.w    $10(a6),$6(a5)
  914.     rts
  915. mt_mysub:
  916.     sub.w    d0,$10(a6)
  917.     move.w    $18(a6),d0
  918.     cmp.w    $10(a6),d0
  919.     blt.s    mt_myok
  920.     move.w    $18(a6),$10(a6)
  921.     clr.w    $18(a6)
  922.     move.w    $10(a6),$6(a5)
  923.     rts
  924.  
  925. mt_vib:    move.b    $3(a6),d0
  926.     beq.s    mt_vi
  927.     move.b    d0,$1a(a6)
  928.  
  929. mt_vi:    move.b    $1b(a6),d0
  930.     lea    mt_sin(pc),a4
  931.     lsr.w    #$2,d0
  932.     and.w    #$1f,d0
  933.     moveq    #0,d2
  934.     move.b    (a4,d0.w),d2
  935.     move.b    $1a(a6),d0
  936.     and.w    #$f,d0
  937.     mulu    d0,d2
  938.     lsr.w    #$6,d2
  939.     move.w    $10(a6),d0
  940.     tst.b    $1b(a6)
  941.     bmi.s    mt_vibmin
  942.     add.w    d2,d0
  943.     bra.s    mt_vib2
  944. mt_vibmin:
  945.     sub.w    d2,d0
  946. mt_vib2:move.w    d0,$6(a5)
  947.     move.b    $1a(a6),d0
  948.     lsr.w    #$2,d0
  949.     and.w    #$3c,d0
  950.     add.b    d0,$1b(a6)
  951.     rts
  952.  
  953. mt_nop:    move.w    $10(a6),$6(a5)
  954.     rts
  955.  
  956. mt_checkcom:
  957.     move.w    $2(a6),d0
  958.     and.w    #$fff,d0
  959.     beq.s    mt_nop
  960.     move.b    $2(a6),d0
  961.     and.b    #$f,d0
  962.     tst.b    d0
  963.     beq    mt_arpeggio
  964.     cmp.b    #$1,d0
  965.     beq.s    mt_portup
  966.     cmp.b    #$2,d0
  967.     beq    mt_portdown
  968.     cmp.b    #$3,d0
  969.     beq    mt_myport
  970.     cmp.b    #$4,d0
  971.     beq    mt_vib
  972.     move.w    $10(a6),$6(a5)
  973.     cmp.b    #$a,d0
  974.     beq.s    mt_volslide
  975.     rts
  976.  
  977. mt_volslide:
  978.     moveq    #0,d0
  979.     move.b    $3(a6),d0
  980.     lsr.b    #4,d0
  981.     tst.b    d0
  982.     beq.s    mt_voldown
  983.     add.w    d0,$12(a6)
  984.     cmp.w    #$40,$12(a6)
  985.     bmi.s    mt_vol2
  986.     move.w    #$40,$12(a6)
  987. mt_vol2:move.w    $12(a6),$8(a5)
  988.     rts
  989.  
  990. mt_voldown:
  991.     moveq    #0,d0
  992.     move.b    $3(a6),d0
  993.     and.b    #$f,d0
  994.     sub.w    d0,$12(a6)
  995.     bpl.s    mt_vol3
  996.     clr.w    $12(a6)
  997. mt_vol3:move.w    $12(a6),$8(a5)
  998.     rts
  999.  
  1000. mt_portup:
  1001.     moveq    #0,d0
  1002.     move.b    $3(a6),d0
  1003.     sub.w    d0,$10(a6)
  1004.     move.w    $10(a6),d0
  1005.     and.w    #$fff,d0
  1006.     cmp.w    #$71,d0
  1007.     bpl.s    mt_por2
  1008.     and.w    #$f000,$10(a6)
  1009.     or.w    #$71,$10(a6)
  1010. mt_por2:move.w    $10(a6),d0
  1011.     and.w    #$fff,d0
  1012.     move.w    d0,$6(a5)
  1013.     rts
  1014.  
  1015. mt_portdown:
  1016.     moveq    #0,d0
  1017.     move.b    $3(a6),d0
  1018.     add.w    d0,$10(a6)
  1019.     move.w    $10(a6),d0
  1020.     and.w    #$fff,d0
  1021.     cmp.w    #$358,d0
  1022.     bmi.s    mt_por3
  1023.     and.w    #$f000,$10(a6)
  1024.     or.w    #$358,$10(a6)
  1025. mt_por3:move.w    $10(a6),d0
  1026.     and.w    #$fff,d0
  1027.     move.w    d0,$6(a5)
  1028.     rts
  1029.  
  1030. mt_checkcom2:
  1031.     move.b    $2(a6),d0
  1032.     and.b    #$f,d0
  1033.     cmp.b    #$e,d0
  1034.     beq.s    mt_setfilt
  1035.     cmp.b    #$d,d0
  1036.     beq.s    mt_pattbreak
  1037.     cmp.b    #$b,d0
  1038.     beq.s    mt_posjmp
  1039.     cmp.b    #$c,d0
  1040.     beq.s    mt_setvol
  1041.     cmp.b    #$f,d0
  1042.     beq.s    mt_setspeed
  1043.     rts
  1044.  
  1045. mt_setfilt:
  1046.     move.b    $3(a6),d0
  1047.     and.b    #$1,d0
  1048.     asl.b    #$1,d0
  1049.     and.b    #$fd,$bfe001
  1050.     or.b    d0,$bfe001
  1051.     rts
  1052. mt_pattbreak:
  1053.     not.b    mt_break
  1054.     rts
  1055. mt_posjmp:
  1056.     move.b    $3(a6),d0
  1057.     subq.b    #$1,d0
  1058.     move.b    d0,mt_songpos
  1059.     not.b    mt_break
  1060.     rts
  1061. mt_setvol:
  1062.     cmp.b    #$40,$3(a6)
  1063.     ble.s    mt_vol4
  1064.     move.b    #$40,$3(a6)
  1065. mt_vol4:move.b    $3(a6),$8(a5)
  1066.     rts
  1067. mt_setspeed:
  1068.     cmp.b    #$1f,$3(a6)
  1069.     ble.s    mt_sets
  1070.     move.b    #$1f,$3(a6)
  1071. mt_sets:move.b    $3(a6),d0
  1072.     beq.s    mt_rts2
  1073.     move.b    d0,mt_speed
  1074.     clr.b    mt_counter
  1075. mt_rts2:rts
  1076.  
  1077. mt_sin:
  1078.     dc.b $00,$18,$31,$4a,$61,$78,$8d,$a1,$b4,$c5,$d4,$e0,$eb,$f4,$fa,$fd
  1079.     dc.b $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5,$b4,$a1,$8d,$78,$61,$4a,$31,$18
  1080.  
  1081. mt_periods:
  1082.     dc.w $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c,$023a,$021a,$01fc,$01e0
  1083.     dc.w $01c5,$01ac,$0194,$017d,$0168,$0153,$0140,$012e,$011d,$010d,$00fe
  1084.     dc.w $00f0,$00e2,$00d6,$00ca,$00be,$00b4,$00aa,$00a0,$0097,$008f,$0087
  1085.     dc.w $007f,$0078,$0071,$0000,$0000
  1086.  
  1087. mt_speed:    dc.b    $6
  1088. mt_songpos:    dc.b    $0
  1089. mt_pattpos:    dc.w    $0
  1090. mt_counter:    dc.b    $0
  1091.  
  1092. mt_break:    dc.b    $0
  1093. mt_dmacon:    dc.w    $0
  1094. mt_samplestarts:blk.l    $1f,0
  1095. mt_voice1:    blk.w    10,0
  1096.         dc.w    $1
  1097.         blk.w    3,0
  1098. mt_voice2:    blk.w    10,0
  1099.         dc.w    $2
  1100.         blk.w    3,0
  1101. mt_voice3:    blk.w    10,0
  1102.         dc.w    $4
  1103.         blk.w    3,0
  1104. mt_voice4:    blk.w    10,0
  1105.         dc.w    $8
  1106.         blk.w    3,0
  1107.